package com.iwhalecloud.bss.kite.cucc.service.util;

import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.client.api.goods.IGoodsPriceFactorService;
import com.iwhalecloud.bss.kite.cucc.client.dto.goods.GoodPriceAttrReqDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.goods.GoodPriceReqDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.goods.factor.PriceFactorDTO;
import com.iwhalecloud.bss.kite.cucc.service.pos.handler.CuccPosServiceUtils;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteOfferInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInst;
import com.iwhalecloud.bss.kite.service.context.ServiceContext;
import com.ztesoft.bss.common.util.SpringUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * @Description
 * @Author deng.gang
 * @Date 2021/11/13 5:27 下午
 */
public class GoodsPriceFactorUtil {

    public static void transform(GoodPriceReqDTO goodPriceReqDTO, List<PriceFactorDTO> priceFactors) {
        List<GoodPriceAttrReqDTO> goodPriceAttrReqDTOList = new ArrayList<>();
        if (KiteListUtils.isNotEmpty(priceFactors)) {
            priceFactors.forEach(priceFactor -> {
                String attrCode = priceFactor.getAttrCode();
                GoodPriceAttrReqDTO goodPriceAttrReqDTO = new GoodPriceAttrReqDTO();
                goodPriceAttrReqDTO.setAttr(attrCode);
                // 非关键属性作为算费因子，在商品选择页面获取不到值的，销售中心入参传空值给产商品中心
                goodPriceAttrReqDTO.setAttrVal("");
                // 算费因子重复不添加
                if (!goodPriceAttrReqDTOList.stream().anyMatch(propertyVal -> KiteStringUtils.equals(propertyVal.getAttr(), attrCode))) {
                    goodPriceAttrReqDTOList.add(goodPriceAttrReqDTO);
                }
            });
        }
        // 如果返回的计价因子中存在和关键属性一致，则进行填充
        List<GoodPriceAttrReqDTO> selectedGoodPriceAttrList = goodPriceReqDTO.getPropertyValue();
        if (KiteListUtils.isNotEmpty(selectedGoodPriceAttrList)) {
            selectedGoodPriceAttrList.forEach(selectGoodPriceAttr -> {
                goodPriceAttrReqDTOList.stream().filter(dto -> KiteStringUtils.equals(dto.getAttr(), selectGoodPriceAttr.getAttr())).forEach(factor -> {
                    factor.setAttrVal(selectGoodPriceAttr.getAttrVal());
                });
            });
        }
        goodPriceReqDTO.setPropertyValue(goodPriceAttrReqDTOList);
    }

    /**
     * 填充算费因子的属性值，目前融合无资费
     * @param sceneInstId
     * @param goodPriceReq
     * @param priceFactors
     */
    public static void fillAttrValue(String sceneInstId, String custId, GoodPriceReqDTO goodPriceReq, List<PriceFactorDTO> priceFactors) {
        if (KiteListUtils.isEmpty(priceFactors) || Objects.isNull(goodPriceReq.getPropertyValue())) {
            return;
        }
        IQuerySceneInstService querySceneInstService = SpringUtil.getBean(IQuerySceneInstService.class);
        KiteOfferInst mainOfferInst;
        if (CuccPosServiceUtils.isBatchAccept(sceneInstId)) {
            mainOfferInst = getBatchMainInstId(sceneInstId);
        }
        else {
            mainOfferInst = querySceneInstService.getMainOfferInst(sceneInstId);
        }
        if (Objects.isNull(mainOfferInst)) {
            return;
        }
        List<KiteProdInst> prodInsts = querySceneInstService.listProdInstsFromOfferInst(custId, mainOfferInst.getOfferInstId());
        if (KiteListUtils.isNotEmpty(prodInsts)) {
            List<GoodPriceAttrReqDTO> goodPriceAttrReqDTOS = goodPriceReq.getPropertyValue();
            prodInsts.forEach(prodInst -> {
                priceFactors.forEach(priceFactor -> {
                    String attrCode = priceFactor.getAttrCode();
                    KiteAttr attr = prodInst.getAttr(priceFactor.getAttrCode());
                    // 属性为E的不进行值填充
                    if (Objects.nonNull(attr) && !KeyConsts.PROD_ATTR_SHOW_TYPE_E.equals(attr.getShowType())) {
                        // 请求对象中存在这个算费因子
                        if (goodPriceAttrReqDTOS.stream().anyMatch(dto -> KiteStringUtils.equals(dto.getAttr(), attrCode))) {
                            goodPriceAttrReqDTOS.stream().filter(dto -> KiteStringUtils.equals(dto.getAttr(), attrCode)).forEach(targetDTO -> {
                                targetDTO.setAttrVal(Optional.ofNullable(attr.getValue()).orElse(""));
                                targetDTO.setValueType(transAttrValueType(attr.getAttrValueTypeId()));
                            });
                        } else {
                            GoodPriceAttrReqDTO goodPriceAttrReqDTO = new GoodPriceAttrReqDTO();
                            goodPriceAttrReqDTO.setAttr(attrCode);
                            goodPriceAttrReqDTO.setAttrVal(attr.getValue());
                            goodPriceAttrReqDTO.setValueType(transAttrValueType(attr.getAttrValueTypeId()));
                            goodPriceAttrReqDTOS.add(goodPriceAttrReqDTO);
                        }
                    }
                    if (KiteStringUtils.equals(attrCode, "210005360")) {
                        // 城市类型210005360由省份和城市编码决定，不属于产品属性但和产品属性相关
                        String provinceCode = Optional.ofNullable(prodInst.getAttr("2_0000220")).map(KiteAttr::getValue).orElse("");
                        String cityCode = Optional.ofNullable(prodInst.getAttr("2_0000221")).map(KiteAttr::getValue).orElse("");
                        String cityTypeCode = SpringUtil.getBean(IGoodsPriceFactorService.class).getCityTypeCode(provinceCode, cityCode);
                        if (goodPriceAttrReqDTOS.stream().anyMatch(dto -> KiteStringUtils.equals(dto.getAttr(), attrCode))) {
                            goodPriceAttrReqDTOS.stream().filter(dto -> KiteStringUtils.equals(dto.getAttr(), attrCode)).forEach(targetDTO -> {
                                targetDTO.setAttrVal(cityTypeCode);
                                targetDTO.setValueType("OPTIONS");
                            });
                        } else {
                            GoodPriceAttrReqDTO goodPriceAttrReqDTO = new GoodPriceAttrReqDTO();
                            goodPriceAttrReqDTO.setAttr(attrCode);
                            goodPriceAttrReqDTO.setAttrVal(cityTypeCode);
                            goodPriceAttrReqDTO.setValueType("OPTIONS");
                            goodPriceAttrReqDTOS.add(goodPriceAttrReqDTO);
                        }
                    }
                });
            });
        }
    }

    private static String transAttrValueType(String type) {
        String resType = "INPUT";
        if (KiteStringUtils.equalsAny(type, KeyConsts.DROPDOWN, KeyConsts.RADIO)) {
            resType = "OPTIONS";
        }
        return resType;
    }

    /**
     * 批量受理算计，取主套餐实例
     * 1.批量受理录入页面，取根节点下的销售品实例
     * 2.批量受理调整记录单个修改页面，取扩展参数curOfferInstId
     * 3.批量受理定时任务加载实例，取ServiceContext.getCurOfferInstId()
     * @param sceneInstId
     * @return
     */
    public static KiteOfferInst getBatchMainInstId(String sceneInstId) {
        IQuerySceneInstService querySceneInstService = SpringUtil.getBean(IQuerySceneInstService.class);
        if (KiteStringUtils.isNotEmpty(ServiceContext.getCurOfferInstId())) {
            return querySceneInstService.getOfferInst(sceneInstId, ServiceContext.getCurOfferInstId());
        }
        else if (KiteStringUtils
            .isNotEmpty(querySceneInstService.getExtParameterValue(sceneInstId, "curOfferInstId"))) {
            // 兼容单个修改场景
            return querySceneInstService.getOfferInst(sceneInstId,
                querySceneInstService.getExtParameterValue(sceneInstId, "curOfferInstId"));
        }
        else {
            return querySceneInstService.getOfferInst(sceneInstId,
                querySceneInstService.getSceneInst(sceneInstId).getRootInstId());
        }
    }
}
